package com.lizemin.socketIo.config;

import com.corundumstudio.socketio.SocketConfig;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.annotation.SpringAnnotationScanner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置和管理 Socket.IO 服务器
 */
@Configuration
public class SocketIoConfig {

    @Bean
    public SocketIOServer socketIOServer() {
        // 创建 SocketConfig 实例，用于配置底层 Socket 连接
        SocketConfig socketConfig = new SocketConfig();

        // 设置 TCP 无延迟，禁用 Nagle 算法，数据会立即发送，减少延迟
        socketConfig.setTcpNoDelay(true);

        // 设置 Socket 关闭时的延迟时间为 0 秒，即立即关闭
        socketConfig.setSoLinger(0);

        // 创建 netty - socketio 的 Configuration 实例，用于配置 Socket.IO 服务器
        com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration();
        // 将 SocketConfig 配置应用到 Socket.IO 服务器配置中
        config.setSocketConfig(socketConfig);

        // 设置 Socket.IO 服务器监听的主机名
        config.setHostname("localhost");

        // 设置 Socket.IO 服务器监听的端口号
        config.setPort(9092);

        // 明确指定允许的源，这里是客户端所在的地址
        config.setOrigin("http://localhost:8401");
        config.setUpgradeTimeout(10_000);
        config.setPingTimeout(60_000);
        config.setPingInterval(25_000);

        // 使用配置创建并返回一个 SocketIOServer 实例
        return new SocketIOServer(config);
    }

    /**
     * 创建 SpringAnnotationScanner 实例，用于扫描@OnConnect, @OnEvent, @OnDisconnect等注解
     *
     * @param socketServer  SocketIOServer 实例
     * @return  SpringAnnotationScanner 实例
     */
    @Bean
    public SpringAnnotationScanner springAnnotationScanner(SocketIOServer socketServer) {
        return new SpringAnnotationScanner(socketServer);
    }


}